1 Modifying the dataset

1.1 Bringing in the datasets

To work with the Countries dataset, we will be bringing in Country Info from my github. We will also be limiting it to 2015 for our plot of life expectancy and income in 2015.

Countries<-read.csv(file="https://dannyoc99.github.io/DOCAL/dataset/Country%20Info.csv")
Countries_2015<-filter(Countries,year==2015)%>%mutate(PolutionK=pop/1000)

2 Looking into the 2015 dataset

DT::datatable(Countries_2015, fillContainer = FALSE, options = list(pageLength = 11))

3 Graphing Life Expectancy and Income during 2015

plot.life<-Countries_2015$lifeExp
plot.pop<-Countries_2015$PolutionK
plot.region<-Countries_2015$continent
plot.gdp<-Countries_2015$gdpPercap
sizeref <- max(plot.pop)/1000
plot_ly(
    data = Countries_2015,
    x = ~plot.life,  # Horizontal axis 
    y = ~plot.gdp,   # Vertical axis 
    color = ~factor(plot.region),  # must be a numeric factor
     hovertext = ~Countries_2015$Country,
      text= ~Countries_2015$pop,     # show the species in the hover text
     ## using the following hovertemplate() to add the information of the
     ## Two numerical variables to the hover text.
     hovertemplate = paste('<i><b>Income<b></i>: %{y}',
                           '<br><b>Life Expectancy</b>:  %{x}',
                           '<br><b>Population: %{text}</b>',
                           '<br><b>Country: %{hovertext}</b>'),
     alpha  = 0.9,
     marker = list(size = ~plot.pop, sizemode = 'area',sizeref=sizeref, opacity=0.5,fill='tozeroy' ),
     type = "scatter",
     mode = "markers",
     ## graphic size
     width = 700,
    height = 500) %>%
      layout(  
      ### Title 
      title =list(text = "Life Expectancy vs Income in 2015", 
                  font = list(family = "Times New Roman",  # HTML font family  
                                size = 18,
                               color = "red")), 
      ### legend
      legend = list(title = list(text = 'Continent',
                                 font = list(family = "Courier New",
                                               size = 14,
                                              color = "green")),
                    bgcolor = "ivory",
                    bordercolor = "navy",
                    groupclick = "togglegroup",  # one of  "toggleitem" AND "togglegroup".
                    orientation = "v"  # Sets the orientation of the legend.
                    ),      ## Background
      plot_bgcolor ='#f7f7f7', 
      ## Axes labels
             xaxis = list( 
                    title=list(text = 'Life Expectancy',
                               font = list(family = 'Arial')),
                    zerolinecolor = 'red', 
                    zerolinewidth = 2, 
                    gridcolor = 'white'), 
            yaxis = list( 
                    title=list(text = 'Income',
                               font = list(family = 'Arial')),
                    zerolinecolor = 'purple', 
                    zerolinewidth = 2, 
                    gridcolor = 'white'),
       ## annotations
       annotations = list(  
                     x = .4,   # between 0 and 1. 0 = left, 1 = right
                     y = .9,   # between 0 and 1, 0 = bottom, 1 = top
                  font = list(size = 12,
                              color = "darkred"),   
                  text = "The point size 
          is proportional 
              to the population size
                  
                  
                  
                  
                  
                  
                  ",   
                  xref = "paper",  # "container" spans the entire `width` of the 
                                   #  lot. "paper" refers to the width of the 
                                   #  plotting area only. yref = "paper",  
                                   #  same as xref.
               xanchor = "center", #  horizontal alignment with respect to its x position
               yanchor = "bottom", #  similar to xanchor  
             showarrow = FALSE))

Looking at the graph, we have a scatter plot of Life Expectancy and Income. By adding the continent as a color reference and population size as a size reference we can get a 4D look at a 2D plot. From this view, we can see that African Countries consistently have lower life expectancy. Additionally, we can see an exponential relationship between life expectancy and income. Additionally we can see that European countries have more consistent population sizes than the other continents. Finally, the graph lets us see that the GDP Per Capita has a very large margin, as most of the countries do not even make it to the first tick mark of the graph showing many outlier countries in terms of GDP.

4 Animatee Life Expectancies vs Income

plot.life<-Countries$lifeExp
plot.pop<-Countries$pop
plot.region<-Countries$continent
plot.gdp<-Countries$gdpPercap
plot.year<-Countries$year

pal.IBM <- c("#332288", "#117733", "#0072B2","#D55E00", "#882255")
pal.IBM <- setNames(pal.IBM, c("Asia", "Europe", "Africa", "Americas", "Oceania"))


fig <- Countries %>%
  plot_ly(
    x = ~plot.gdp, 
    y = ~plot.life, 
    size = ~(2*log(plot.pop)-11)^2,
    color = ~plot.region, 
    colors = pal.IBM,   # custom colors
    #marker = list(size = ~(log(pop)-10),  sizemode = 'area'),
    frame = ~plot.year,      # the time variable to
    # to display in the hover
    text = ~paste("Country:", Country,
                  "<br>Continent:", continent,
                  "<br>Year:", year,
                  "<br>LifeExp:", lifeExp,
                  "<br>Pop:", pop,
                  "<br>gdpPerCap:", gdpPercap),
    hoverinfo = "text",
    type = 'scatter',
    mode = 'markers'
  )
fig <- fig %>% 
layout(  
      ### Title 
      title =list(text = "Life Expectancy vs Income in 2015", 
                  font = list(family = "Times New Roman",  # HTML font family  
                                size = 18,
                               color = "red")), 
      ## Axes labels
             xaxis = list( 
                    title=list(text = 'Income',
                               font = list(family = 'Arial')),
                    zerolinewidth = 2, 
                    gridcolor = 'white'), 
            yaxis = list( 
                    title=list(text = 'Life Expectancy',
                               font = list(family = 'Arial')),
                    zerolinewidth = 2, 
                    gridcolor = 'white')
    
  )

fig

By animating the graph, we have yet another dimension added to our 2-D graph, year. Whilst all of the 2015 conclusions hold mostly the same, something interesting about the year factor is that GDP and income was not always an exponential relationship. By increasing the years and starting at a base, we can see it used to be more of a cluster of points without a real pattern, and the closer to the present we get, the stronger that exponential relationship gets.

5 Looking at the mean population size across Continents in 2015

barplotdata = aggregate(Countries_2015[,6], by = list(Countries_2015$continent), FUN = mean)
plot_ly(
  data = barplotdata,
   x = ~Group.1,
   y = ~x,
   type = "bar",
   name = "Average Population Size by Country",
   ## graphic size
   width = 700,
   height = 400) %>%
    layout( yaxis = list(title ="Mean"),
            xaxis = list(title = "Continent"),
            title = "Average Population Size by Country",
                  ## margin of the plot
      margin = list(
              b = 50,
              l = 100,
              t = 120,
              r = 50
      ))

Overall, I think it is quite hard to gain extremely valuable information out of the sizes of marks on a scatter plot, so I thought I would make the box plot for mean population size per continent to better see this relationship. Overall, we get a lot more data from this box plot. We can see that Asia has the highest average population size, Oceania has the smallest, and Africa and Europe have quite similar averages.

LS0tDQp0aXRsZTogIkhvbWV3b3JrIDY6IFBsb3R0aW5nIExpZmUgRXhwZWN0YW5jeSBhbmQgSW5jb21lIHVzaW5nIFBsb3RseSINCmF1dGhvcjogIkRhbmllbCBPQ2FsbGFnaGFuIg0KZGF0ZTogIiINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIGZpZ193aWR0aDogNg0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvY19jb2xsYXBzZWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHNtb290aF9zY3JvbGw6IHRydWUNCiAgICB0aGVtZTogcmVhZGFibGUNCiAgcGRmX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIGZpZ193aWR0aDogNQ0KICAgIGZpZ19oZWlnaHQ6IDQNCi0tLQ0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCg0KLyogVGFibGUgb2YgY29udGVudCAtIG5hdmlnYXRpb24gKi8NCmRpdiNUT0MgbGkgew0KICAgIGxpc3Qtc3R5bGU6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrOw0KICAgIGJhY2tncm91bmQtaW1hZ2U6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXJlcGVhdDpub25lOw0KICAgIGJhY2tncm91bmQtcG9zaXRpb246MDsNCiAgICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsNCiAgICBjb2xvcjogbGlnaHRibHVlOw0KfQ0KDQpoMS50aXRsZSB7DQogIGZvbnQtc2l6ZTogMjRweDsNCiAgY29sb3I6IE5hdnk7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDQuYXV0aG9yIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogYmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGNvbG9yOiBibHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoMSB7IC8qIEhlYWRlciAzIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAyMnB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBibHVlOw0KICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmgyIHsgLyogSGVhZGVyIDMgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IE5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDMgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTVweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogTmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoNCB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBOYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQo8L3N0eWxlPg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCm9wdGlvbnMocmVwb3MgPSBsaXN0KENSQU49Imh0dHA6Ly9jcmFuLnJzdHVkaW8uY29tLyIpKQ0KaWYgKCFyZXF1aXJlKCJ0aWR5dmVyc2UiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikNCiAgIGxpYnJhcnkodGlkeXZlcnNlKQ0KfQ0KaWYgKCFyZXF1aXJlKCJrbml0ciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpDQogICBsaWJyYXJ5KGtuaXRyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJjb3dwbG90IikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImNvd3Bsb3QiKQ0KICAgbGlicmFyeShjb3dwbG90KQ0KfQ0KaWYgKCFyZXF1aXJlKCJsYXRleDJleHAiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygibGF0ZXgyZXhwIikNCiAgIGxpYnJhcnkobGF0ZXgyZXhwKQ0KfQ0KaWYgKCFyZXF1aXJlKCJwbG90bHkiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygicGxvdGx5IikNCiAgIGxpYnJhcnkocGxvdGx5KQ0KfQ0KaWYgKCFyZXF1aXJlKCJnYXBtaW5kZXIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiZ2FwbWluZGVyIikNCiAgIGxpYnJhcnkoZ2FwbWluZGVyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJwbmciKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoInBuZyIpICAgIA0KICAgIGxpYnJhcnkoInBuZyIpDQp9DQppZiAoIXJlcXVpcmUoIlJDdXJsIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJSQ3VybCIpICAgIA0KICAgIGxpYnJhcnkoIlJDdXJsIikNCn0NCmlmICghcmVxdWlyZSgiY29sb3VycGlja2VyIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJjb2xvdXJwaWNrZXIiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiY29sb3VycGlja2VyIikNCn0NCmlmICghcmVxdWlyZSgiZ2dhbmltYXRlIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJnZ2FuaW1hdGUiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiZ2dhbmltYXRlIikNCn0NCmlmICghcmVxdWlyZSgiZ2lmc2tpIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJnaWZza2kiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiZ2lmc2tpIikNCn0NCmlmICghcmVxdWlyZSgibWFnaWNrIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJtYWdpY2siKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgibWFnaWNrIikNCn0NCmlmICghcmVxdWlyZSgiZ3JEZXZpY2VzIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJnckRldmljZXMiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiZ3JEZXZpY2VzIikNCn0NCmlmICghcmVxdWlyZSgianBlZyIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygianBlZyIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJqcGVnIikNCn0NCmlmICghcmVxdWlyZSgiZ2dyaWRnZXMiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImdncmlkZ2VzIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdncmlkZ2VzIikNCn0NCmlmICghcmVxdWlyZSgicGx5ciIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygicGx5ciIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJwbHlyIikNCn0NCmlmICghcmVxdWlyZSgiZ2dpcmFwaCIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ2dpcmFwaCIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJnZ2lyYXBoIikNCn0NCmlmICghcmVxdWlyZSgiaGlnaGNoYXJ0ZXIiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImhpZ2hjaGFydGVyIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImhpZ2hjaGFydGVyIikNCn0NCmlmICghcmVxdWlyZSgiZm9yZWNhc3QiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImZvcmVjYXN0IikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImZvcmVjYXN0IikNCn0NCiMjIA0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsICAgDQogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFJVRSwgICANCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IE5BKQ0KYGBgDQoNCg0KDQojIE1vZGlmeWluZyB0aGUgZGF0YXNldA0KDQojIyBCcmluZ2luZyBpbiB0aGUgZGF0YXNldHMgDQoNClRvIHdvcmsgd2l0aCB0aGUgQ291bnRyaWVzIGRhdGFzZXQsIHdlIHdpbGwgYmUgYnJpbmdpbmcgaW4gQ291bnRyeSBJbmZvIGZyb20gbXkgZ2l0aHViLiBXZSB3aWxsIGFsc28gYmUgbGltaXRpbmcgaXQgdG8gMjAxNSBmb3Igb3VyIHBsb3Qgb2YgbGlmZSBleHBlY3RhbmN5IGFuZCBpbmNvbWUgaW4gMjAxNS4gDQpgYGB7ciBkYXRhc2V0fQ0KQ291bnRyaWVzPC1yZWFkLmNzdihmaWxlPSJodHRwczovL2Rhbm55b2M5OS5naXRodWIuaW8vRE9DQUwvZGF0YXNldC9Db3VudHJ5JTIwSW5mby5jc3YiKQ0KQ291bnRyaWVzXzIwMTU8LWZpbHRlcihDb3VudHJpZXMseWVhcj09MjAxNSklPiVtdXRhdGUoUG9sdXRpb25LPXBvcC8xMDAwKQ0KYGBgDQoNCiMgTG9va2luZyBpbnRvIHRoZSAyMDE1IGRhdGFzZXQNCg0KYGBge3IgZGF0YX0NCkRUOjpkYXRhdGFibGUoQ291bnRyaWVzXzIwMTUsIGZpbGxDb250YWluZXIgPSBGQUxTRSwgb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDExKSkNCmBgYA0KDQojIEdyYXBoaW5nIExpZmUgRXhwZWN0YW5jeSBhbmQgSW5jb21lIGR1cmluZyAyMDE1DQoNCmBgYHtyIDIwMTVwbG90fQ0KcGxvdC5saWZlPC1Db3VudHJpZXNfMjAxNSRsaWZlRXhwDQpwbG90LnBvcDwtQ291bnRyaWVzXzIwMTUkUG9sdXRpb25LDQpwbG90LnJlZ2lvbjwtQ291bnRyaWVzXzIwMTUkY29udGluZW50DQpwbG90LmdkcDwtQ291bnRyaWVzXzIwMTUkZ2RwUGVyY2FwDQpzaXplcmVmIDwtIG1heChwbG90LnBvcCkvMTAwMA0KcGxvdF9seSgNCiAgICBkYXRhID0gQ291bnRyaWVzXzIwMTUsDQogICAgeCA9IH5wbG90LmxpZmUsICAjIEhvcml6b250YWwgYXhpcyANCiAgICB5ID0gfnBsb3QuZ2RwLCAgICMgVmVydGljYWwgYXhpcyANCiAgICBjb2xvciA9IH5mYWN0b3IocGxvdC5yZWdpb24pLCAgIyBtdXN0IGJlIGEgbnVtZXJpYyBmYWN0b3INCiAgICAgaG92ZXJ0ZXh0ID0gfkNvdW50cmllc18yMDE1JENvdW50cnksDQogICAgICB0ZXh0PSB+Q291bnRyaWVzXzIwMTUkcG9wLCAgICAgIyBzaG93IHRoZSBzcGVjaWVzIGluIHRoZSBob3ZlciB0ZXh0DQogICAgICMjIHVzaW5nIHRoZSBmb2xsb3dpbmcgaG92ZXJ0ZW1wbGF0ZSgpIHRvIGFkZCB0aGUgaW5mb3JtYXRpb24gb2YgdGhlDQogICAgICMjIFR3byBudW1lcmljYWwgdmFyaWFibGVzIHRvIHRoZSBob3ZlciB0ZXh0Lg0KICAgICBob3ZlcnRlbXBsYXRlID0gcGFzdGUoJzxpPjxiPkluY29tZTxiPjwvaT46ICV7eX0nLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxicj48Yj5MaWZlIEV4cGVjdGFuY3k8L2I+OiAgJXt4fScsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAnPGJyPjxiPlBvcHVsYXRpb246ICV7dGV4dH08L2I+JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICc8YnI+PGI+Q291bnRyeTogJXtob3ZlcnRleHR9PC9iPicpLA0KICAgICBhbHBoYSAgPSAwLjksDQogICAgIG1hcmtlciA9IGxpc3Qoc2l6ZSA9IH5wbG90LnBvcCwgc2l6ZW1vZGUgPSAnYXJlYScsc2l6ZXJlZj1zaXplcmVmLCBvcGFjaXR5PTAuNSxmaWxsPSd0b3plcm95JyApLA0KICAgICB0eXBlID0gInNjYXR0ZXIiLA0KICAgICBtb2RlID0gIm1hcmtlcnMiLA0KICAgICAjIyBncmFwaGljIHNpemUNCiAgICAgd2lkdGggPSA3MDAsDQogICAgaGVpZ2h0ID0gNTAwKSAlPiUNCiAgICAgIGxheW91dCggIA0KICAgICAgIyMjIFRpdGxlIA0KICAgICAgdGl0bGUgPWxpc3QodGV4dCA9ICJMaWZlIEV4cGVjdGFuY3kgdnMgSW5jb21lIGluIDIwMTUiLCANCiAgICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGZhbWlseSA9ICJUaW1lcyBOZXcgUm9tYW4iLCAgIyBIVE1MIGZvbnQgZmFtaWx5ICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDE4LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gInJlZCIpKSwgDQogICAgICAjIyMgbGVnZW5kDQogICAgICBsZWdlbmQgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gJ0NvbnRpbmVudCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChmYW1pbHkgPSAiQ291cmllciBOZXciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMTQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAiZ3JlZW4iKSksDQogICAgICAgICAgICAgICAgICAgIGJnY29sb3IgPSAiaXZvcnkiLA0KICAgICAgICAgICAgICAgICAgICBib3JkZXJjb2xvciA9ICJuYXZ5IiwNCiAgICAgICAgICAgICAgICAgICAgZ3JvdXBjbGljayA9ICJ0b2dnbGVncm91cCIsICAjIG9uZSBvZiAgInRvZ2dsZWl0ZW0iIEFORCAidG9nZ2xlZ3JvdXAiLg0KICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbiA9ICJ2IiAgIyBTZXRzIHRoZSBvcmllbnRhdGlvbiBvZiB0aGUgbGVnZW5kLg0KICAgICAgICAgICAgICAgICAgICApLCAgICAgICMjIEJhY2tncm91bmQNCiAgICAgIHBsb3RfYmdjb2xvciA9JyNmN2Y3ZjcnLCANCiAgICAgICMjIEF4ZXMgbGFiZWxzDQogICAgICAgICAgICAgeGF4aXMgPSBsaXN0KCANCiAgICAgICAgICAgICAgICAgICAgdGl0bGU9bGlzdCh0ZXh0ID0gJ0xpZmUgRXhwZWN0YW5jeScsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoZmFtaWx5ID0gJ0FyaWFsJykpLA0KICAgICAgICAgICAgICAgICAgICB6ZXJvbGluZWNvbG9yID0gJ3JlZCcsIA0KICAgICAgICAgICAgICAgICAgICB6ZXJvbGluZXdpZHRoID0gMiwgDQogICAgICAgICAgICAgICAgICAgIGdyaWRjb2xvciA9ICd3aGl0ZScpLCANCiAgICAgICAgICAgIHlheGlzID0gbGlzdCggDQogICAgICAgICAgICAgICAgICAgIHRpdGxlPWxpc3QodGV4dCA9ICdJbmNvbWUnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGZhbWlseSA9ICdBcmlhbCcpKSwNCiAgICAgICAgICAgICAgICAgICAgemVyb2xpbmVjb2xvciA9ICdwdXJwbGUnLCANCiAgICAgICAgICAgICAgICAgICAgemVyb2xpbmV3aWR0aCA9IDIsIA0KICAgICAgICAgICAgICAgICAgICBncmlkY29sb3IgPSAnd2hpdGUnKSwNCiAgICAgICAjIyBhbm5vdGF0aW9ucw0KICAgICAgIGFubm90YXRpb25zID0gbGlzdCggIA0KICAgICAgICAgICAgICAgICAgICAgeCA9IC40LCAgICMgYmV0d2VlbiAwIGFuZCAxLiAwID0gbGVmdCwgMSA9IHJpZ2h0DQogICAgICAgICAgICAgICAgICAgICB5ID0gLjksICAgIyBiZXR3ZWVuIDAgYW5kIDEsIDAgPSBib3R0b20sIDEgPSB0b3ANCiAgICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KHNpemUgPSAxMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gImRhcmtyZWQiKSwgICANCiAgICAgICAgICAgICAgICAgIHRleHQgPSAiVGhlIHBvaW50IHNpemUgDQogICAgICAgICAgaXMgcHJvcG9ydGlvbmFsIA0KICAgICAgICAgICAgICB0byB0aGUgcG9wdWxhdGlvbiBzaXplDQogICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAiLCAgIA0KICAgICAgICAgICAgICAgICAgeHJlZiA9ICJwYXBlciIsICAjICJjb250YWluZXIiIHNwYW5zIHRoZSBlbnRpcmUgYHdpZHRoYCBvZiB0aGUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIGxvdC4gInBhcGVyIiByZWZlcnMgdG8gdGhlIHdpZHRoIG9mIHRoZSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgcGxvdHRpbmcgYXJlYSBvbmx5LiB5cmVmID0gInBhcGVyIiwgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICBzYW1lIGFzIHhyZWYuDQogICAgICAgICAgICAgICB4YW5jaG9yID0gImNlbnRlciIsICMgIGhvcml6b250YWwgYWxpZ25tZW50IHdpdGggcmVzcGVjdCB0byBpdHMgeCBwb3NpdGlvbg0KICAgICAgICAgICAgICAgeWFuY2hvciA9ICJib3R0b20iLCAjICBzaW1pbGFyIHRvIHhhbmNob3IgIA0KICAgICAgICAgICAgIHNob3dhcnJvdyA9IEZBTFNFKSkNCmBgYA0KDQpMb29raW5nIGF0IHRoZSBncmFwaCwgd2UgaGF2ZSBhIHNjYXR0ZXIgcGxvdCBvZiBMaWZlIEV4cGVjdGFuY3kgYW5kIEluY29tZS4gQnkgYWRkaW5nIHRoZSBjb250aW5lbnQgYXMgYSBjb2xvciByZWZlcmVuY2UgYW5kIHBvcHVsYXRpb24gc2l6ZSBhcyBhIHNpemUgcmVmZXJlbmNlIHdlIGNhbiBnZXQgYSA0RCBsb29rIGF0IGEgMkQgcGxvdC4gRnJvbSB0aGlzIHZpZXcsIHdlIGNhbiBzZWUgdGhhdCBBZnJpY2FuIENvdW50cmllcyBjb25zaXN0ZW50bHkgaGF2ZSBsb3dlciBsaWZlIGV4cGVjdGFuY3kuIEFkZGl0aW9uYWxseSwgd2UgY2FuIHNlZSBhbiBleHBvbmVudGlhbCByZWxhdGlvbnNoaXAgYmV0d2VlbiBsaWZlIGV4cGVjdGFuY3kgYW5kIGluY29tZS4gQWRkaXRpb25hbGx5IHdlIGNhbiBzZWUgdGhhdCBFdXJvcGVhbiBjb3VudHJpZXMgaGF2ZSBtb3JlIGNvbnNpc3RlbnQgcG9wdWxhdGlvbiBzaXplcyB0aGFuIHRoZSBvdGhlciBjb250aW5lbnRzLiBGaW5hbGx5LCB0aGUgZ3JhcGggbGV0cyB1cyBzZWUgdGhhdCB0aGUgR0RQIFBlciBDYXBpdGEgaGFzIGEgdmVyeSBsYXJnZSBtYXJnaW4sIGFzIG1vc3Qgb2YgdGhlIGNvdW50cmllcyBkbyBub3QgZXZlbiBtYWtlIGl0IHRvIHRoZSBmaXJzdCB0aWNrIG1hcmsgb2YgdGhlIGdyYXBoIHNob3dpbmcgbWFueSBvdXRsaWVyIGNvdW50cmllcyBpbiB0ZXJtcyBvZiBHRFAuDQoNCg0KIyBBbmltYXRlZSBMaWZlIEV4cGVjdGFuY2llcyB2cyBJbmNvbWUgDQoNCmBgYHtyIGFuaW1hdGV9DQoNCnBsb3QubGlmZTwtQ291bnRyaWVzJGxpZmVFeHANCnBsb3QucG9wPC1Db3VudHJpZXMkcG9wDQpwbG90LnJlZ2lvbjwtQ291bnRyaWVzJGNvbnRpbmVudA0KcGxvdC5nZHA8LUNvdW50cmllcyRnZHBQZXJjYXANCnBsb3QueWVhcjwtQ291bnRyaWVzJHllYXINCg0KcGFsLklCTSA8LSBjKCIjMzMyMjg4IiwgIiMxMTc3MzMiLCAiIzAwNzJCMiIsIiNENTVFMDAiLCAiIzg4MjI1NSIpDQpwYWwuSUJNIDwtIHNldE5hbWVzKHBhbC5JQk0sIGMoIkFzaWEiLCAiRXVyb3BlIiwgIkFmcmljYSIsICJBbWVyaWNhcyIsICJPY2VhbmlhIikpDQoNCg0KZmlnIDwtIENvdW50cmllcyAlPiUNCiAgcGxvdF9seSgNCiAgICB4ID0gfnBsb3QuZ2RwLCANCiAgICB5ID0gfnBsb3QubGlmZSwgDQogICAgc2l6ZSA9IH4oMipsb2cocGxvdC5wb3ApLTExKV4yLA0KICAgIGNvbG9yID0gfnBsb3QucmVnaW9uLCANCiAgICBjb2xvcnMgPSBwYWwuSUJNLCAgICMgY3VzdG9tIGNvbG9ycw0KICAgICNtYXJrZXIgPSBsaXN0KHNpemUgPSB+KGxvZyhwb3ApLTEwKSwgIHNpemVtb2RlID0gJ2FyZWEnKSwNCiAgICBmcmFtZSA9IH5wbG90LnllYXIsICAgICAgIyB0aGUgdGltZSB2YXJpYWJsZSB0bw0KICAgICMgdG8gZGlzcGxheSBpbiB0aGUgaG92ZXINCiAgICB0ZXh0ID0gfnBhc3RlKCJDb3VudHJ5OiIsIENvdW50cnksDQogICAgICAgICAgICAgICAgICAiPGJyPkNvbnRpbmVudDoiLCBjb250aW5lbnQsDQogICAgICAgICAgICAgICAgICAiPGJyPlllYXI6IiwgeWVhciwNCiAgICAgICAgICAgICAgICAgICI8YnI+TGlmZUV4cDoiLCBsaWZlRXhwLA0KICAgICAgICAgICAgICAgICAgIjxicj5Qb3A6IiwgcG9wLA0KICAgICAgICAgICAgICAgICAgIjxicj5nZHBQZXJDYXA6IiwgZ2RwUGVyY2FwKSwNCiAgICBob3ZlcmluZm8gPSAidGV4dCIsDQogICAgdHlwZSA9ICdzY2F0dGVyJywNCiAgICBtb2RlID0gJ21hcmtlcnMnDQogICkNCmZpZyA8LSBmaWcgJT4lIA0KbGF5b3V0KCAgDQogICAgICAjIyMgVGl0bGUgDQogICAgICB0aXRsZSA9bGlzdCh0ZXh0ID0gIkxpZmUgRXhwZWN0YW5jeSB2cyBJbmNvbWUgaW4gMjAxNSIsIA0KICAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoZmFtaWx5ID0gIlRpbWVzIE5ldyBSb21hbiIsICAjIEhUTUwgZm9udCBmYW1pbHkgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMTgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAicmVkIikpLCANCiAgICAgICMjIEF4ZXMgbGFiZWxzDQogICAgICAgICAgICAgeGF4aXMgPSBsaXN0KCANCiAgICAgICAgICAgICAgICAgICAgdGl0bGU9bGlzdCh0ZXh0ID0gJ0luY29tZScsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoZmFtaWx5ID0gJ0FyaWFsJykpLA0KICAgICAgICAgICAgICAgICAgICB6ZXJvbGluZXdpZHRoID0gMiwgDQogICAgICAgICAgICAgICAgICAgIGdyaWRjb2xvciA9ICd3aGl0ZScpLCANCiAgICAgICAgICAgIHlheGlzID0gbGlzdCggDQogICAgICAgICAgICAgICAgICAgIHRpdGxlPWxpc3QodGV4dCA9ICdMaWZlIEV4cGVjdGFuY3knLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGZhbWlseSA9ICdBcmlhbCcpKSwNCiAgICAgICAgICAgICAgICAgICAgemVyb2xpbmV3aWR0aCA9IDIsIA0KICAgICAgICAgICAgICAgICAgICBncmlkY29sb3IgPSAnd2hpdGUnKQ0KICAgIA0KICApDQoNCmZpZw0KYGBgDQoNCkJ5IGFuaW1hdGluZyB0aGUgZ3JhcGgsIHdlIGhhdmUgeWV0IGFub3RoZXIgZGltZW5zaW9uIGFkZGVkIHRvIG91ciAyLUQgZ3JhcGgsIHllYXIuIFdoaWxzdCBhbGwgb2YgdGhlIDIwMTUgY29uY2x1c2lvbnMgaG9sZCBtb3N0bHkgdGhlIHNhbWUsIHNvbWV0aGluZyBpbnRlcmVzdGluZyBhYm91dCB0aGUgeWVhciBmYWN0b3IgaXMgdGhhdCBHRFAgYW5kIGluY29tZSB3YXMgbm90IGFsd2F5cyBhbiBleHBvbmVudGlhbCByZWxhdGlvbnNoaXAuIEJ5IGluY3JlYXNpbmcgdGhlIHllYXJzIGFuZCBzdGFydGluZyBhdCBhIGJhc2UsIHdlIGNhbiBzZWUgaXQgdXNlZCB0byBiZSBtb3JlIG9mIGEgY2x1c3RlciBvZiBwb2ludHMgd2l0aG91dCBhIHJlYWwgcGF0dGVybiwgYW5kIHRoZSBjbG9zZXIgdG8gdGhlIHByZXNlbnQgd2UgZ2V0LCB0aGUgc3Ryb25nZXIgdGhhdCBleHBvbmVudGlhbCByZWxhdGlvbnNoaXAgZ2V0cy4NCg0KIyBMb29raW5nIGF0IHRoZSBtZWFuIHBvcHVsYXRpb24gc2l6ZSBhY3Jvc3MgQ29udGluZW50cyBpbiAyMDE1DQoNCmBgYHtyIGJveH0NCmJhcnBsb3RkYXRhID0gYWdncmVnYXRlKENvdW50cmllc18yMDE1Wyw2XSwgYnkgPSBsaXN0KENvdW50cmllc18yMDE1JGNvbnRpbmVudCksIEZVTiA9IG1lYW4pDQpwbG90X2x5KA0KICBkYXRhID0gYmFycGxvdGRhdGEsDQogICB4ID0gfkdyb3VwLjEsDQogICB5ID0gfngsDQogICB0eXBlID0gImJhciIsDQogICBuYW1lID0gIkF2ZXJhZ2UgUG9wdWxhdGlvbiBTaXplIGJ5IENvdW50cnkiLA0KICAgIyMgZ3JhcGhpYyBzaXplDQogICB3aWR0aCA9IDcwMCwNCiAgIGhlaWdodCA9IDQwMCkgJT4lDQogICAgbGF5b3V0KCB5YXhpcyA9IGxpc3QodGl0bGUgPSJNZWFuIiksDQogICAgICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQ29udGluZW50IiksDQogICAgICAgICAgICB0aXRsZSA9ICJBdmVyYWdlIFBvcHVsYXRpb24gU2l6ZSBieSBDb3VudHJ5IiwNCiAgICAgICAgICAgICAgICAgICMjIG1hcmdpbiBvZiB0aGUgcGxvdA0KICAgICAgbWFyZ2luID0gbGlzdCgNCiAgICAgICAgICAgICAgYiA9IDUwLA0KICAgICAgICAgICAgICBsID0gMTAwLA0KICAgICAgICAgICAgICB0ID0gMTIwLA0KICAgICAgICAgICAgICByID0gNTANCiAgICAgICkpDQpgYGANCg0KT3ZlcmFsbCwgSSB0aGluayBpdCBpcyBxdWl0ZSBoYXJkIHRvIGdhaW4gZXh0cmVtZWx5IHZhbHVhYmxlIGluZm9ybWF0aW9uIG91dCBvZiB0aGUgc2l6ZXMgb2YgbWFya3Mgb24gYSBzY2F0dGVyIHBsb3QsIHNvIEkgdGhvdWdodCBJIHdvdWxkIG1ha2UgdGhlIGJveCBwbG90IGZvciBtZWFuIHBvcHVsYXRpb24gc2l6ZSBwZXIgY29udGluZW50IHRvIGJldHRlciBzZWUgdGhpcyByZWxhdGlvbnNoaXAuIE92ZXJhbGwsIHdlIGdldCBhIGxvdCBtb3JlIGRhdGEgZnJvbSB0aGlzIGJveCBwbG90LiBXZSBjYW4gc2VlIHRoYXQgQXNpYSBoYXMgdGhlIGhpZ2hlc3QgYXZlcmFnZSBwb3B1bGF0aW9uIHNpemUsIE9jZWFuaWEgaGFzIHRoZSBzbWFsbGVzdCwgYW5kIEFmcmljYSBhbmQgRXVyb3BlIGhhdmUgcXVpdGUgc2ltaWxhciBhdmVyYWdlcy4NCg0K